home *** CD-ROM | disk | FTP | other *** search
Text File | 1988-11-29 | 8.0 KB | 322 lines | [TEXT/MPS ] |
- UNIT MainDlog;
- {-------------------------------------------}
- (*
- ©1988 by Steve Seaquist. All rights reserved.
- Used by permission. Use at your own risk.
- No warranty is expressed or implied.
-
- This Macintosh virus-detecting program was
- originally published and explained in the
- February 1989 issue of MacTutor magazine.
- Some aspects of its design are important to
- security, and it uses some unusual
- techniques, so please read the article.
- *)
- {-------------------------------------------}
- INTERFACE
- USES
- MemTypes,QuickDraw,OSIntf,ToolIntf,
- PackIntf,Globals;
-
- PROCEDURE InitMainDlog;
- FUNCTION MainDlogWorkRequested
- : TMainItem;
-
- {*******************************************}
- IMPLEMENTATION
- {$R-}
-
- CONST
- {--------item range--------}
- kItemFst = eDirs;
- kItemLst = eDBtn;
- {----item type subranges---}
- kBtnFst = eDirs;
- kBtnLst = eQuit;
- kChkFst = eAwait;
- kChkLst = eTrace;
- kStatFst = eMain;
- kStatLst = eScOW;
- kUItmFst = eDBtn;
- kUItmLst = eDBtn;
- {---titled item subrange---}
- kTItmFst = eDirs;
- kTItmLst = eScOW;
-
- TYPE
- TDitmPtr = ^TDitmRec;
- TDitmRec =
- PACKED RECORD
- fProcPtr: ProcPtr;
- fRect: Rect;
- fType: Byte;
- fLen: Byte;
- fData: INTEGER;
- END;
-
- VAR
- gDBtnRect: Rect;
- gHdl: ARRAY [eAwait..eTrace]
- OF ControlHandle;
- gRect: ARRAY [eAwait..eTrace]
- OF Rect;
-
- {-------------------------------------------}
- PROCEDURE ChkChk
- (pItem: TMainItem);
- BEGIN
- IF (pItem < kChkFst)
- OR (pItem > kChkLst) THEN
- BEGIN
- SysBeep(3);
- EXIT(ChkChk);
- END;
- SetCtlValue(gHdl[pItem],ORD(gOption[pItem]));
- IF gDisabled[pItem] THEN
- BEGIN
- SetDItem(gDlogPtr,ORD(pItem),
- ctrlItem+chkCtrl+itemDisable,
- Handle(gHdl[pItem]),gRect[pItem]);
- HiliteControl(gHdl[pItem],255);
- END
- ELSE
- BEGIN
- SetDItem(gDlogPtr,ORD(pItem),
- ctrlItem+chkCtrl,
- Handle(gHdl[pItem]),gRect[pItem]);
- HiliteControl(gHdl[pItem],0);
- END;
- END;
- {-------------------------------------------}
- PROCEDURE FrameDefaultBtn
- (pWindowPtr:WindowPtr;
- pItemNo: INTEGER);
- VAR
- sPenState: PenState;
- BEGIN
- GetPenState(sPenState);
- PenSize (3,3);
- FrameRoundRect(gDBtnRect,16,16);
- SetPenState(sPenState);
- END;
- {-------------------------------------------}
- PROCEDURE InitMainDlog;
- CONST
- kTitleMax = 27;
- kTItmLen = 42;
- { 14 + kTitleMax + ord(odd(kTitleMax)); }
- kUItmLen = 14;
- VAR
- i: TMainItem;
- sDitmPtr: TDitmPtr;
- sDlogRect: Rect;
- sHdl: Handle;
- sNbrTItms: INTEGER;
- sNbrUItms: INTEGER;
- sRect: ARRAY [eDirs..eScOW]
- OF Rect;
- sSize: Size;
- sTitle: ARRAY [eDirs..eScOW]
- OF STRING[kTitleMax];
- sType: INTEGER;
- BEGIN
- IF gOption[eTrace] THEN
- Trace('InitMainDlog');
- FOR i := kTItmFst TO kTItmLst DO
- IF (i >= kBtnFst)
- AND (i <= kBtnLst) THEN
- BEGIN
- SetRect (sRect[i], 266, 65, 346, 83);
- OffsetRect(sRect[i],0,
- 27*(ORD(i)-ORD(kBtnFst)));
- END
- ELSE IF (i >= kChkFst)
- AND (i <= kChkLst) THEN
- BEGIN
- SetRect (sRect[i], 24, 62, 185, 80);
- OffsetRect(sRect[i],0,
- 20*(ORD(i)-ORD(kChkFst)));
- END
- ELSE
- SetRect (sRect[i], 12, 42, 216, 60);
- OffsetRect(sRect[eMain], 080,-30);
- OffsetRect(sRect[eOpts], 000,000);
- OffsetRect(sRect[eScOW], 216,000);
-
- gDBtnRect := sRect[kItemFst];
- InsetRect (gDBtnRect, -4, -4);
-
- WITH sDlogRect, gSFGetPt DO
- BEGIN
- top := v - 10;
- left := h - 10;
- bottom := top + 210;
- right := left + 368;
- END;
-
- sTitle[eDirs] := 'Directories';
- sTitle[eDiry] := 'Directory';
- sTitle[eEvery] := 'Everything';
- sTitle[eFiles] := 'Files';
- sTitle[eQuit] := 'Quit';
- sTitle[eAwait] := 'Await Keypress';
- sTitle[eBeeps] := 'Beep';
- sTitle[eFgPr] := 'Fingerprint';
- sTitle[eFgPrC] := 'Fingerprint CODEs';
- sTitle[eLList] := 'Long Listing';
- sTitle[eRmVir] := 'Remove Viruses';
- sTitle[eTrace] := 'Trace';
- sTitle[eMain] :=
- 'Security Patrol Main Dialog';
- sTitle[eOpts] := 'Options:';
- sTitle[eScOW] := 'Scope Of Work:';
-
- sNbrTItms := (ORD(kTItmLst)-ORD(kTItmFst))+1;
- sNbrUItms := (ORD(kUItmLst)-ORD(kUItmFst))+1;
- sHdl := NewHandle(2 + (sNbrTItms*kTItmLen)
- + (sNbrUItms*kUItmLen));
- TWordPtr(sHdl^)^ := ORD(kItemLst) - 1;
- sSize := 2;
- FOR i := kItemFst TO kItemLst DO
- BEGIN
- IF gOption[eTrace] THEN
- TraceNbr('sSize = ',sSize);
- sDitmPtr := POINTER(ORD4(sHdl^)+sSize);
- WITH sDitmPtr^ DO
- IF (i >= kTItmFst)
- AND (i <= kTItmLst) THEN
- BEGIN
- fProcPtr := NIL;
- fRect := sRect[i];
- IF (i <= kBtnLst) THEN
- fType := ctrlItem + btnCtrl
- ELSE IF (i <= kChkLst) THEN
- fType := ctrlItem + chkCtrl
- ELSE
- fType := statText + itemDisable;
- BlockMove(@sTitle[i],@fLen,
- LENGTH(sTitle[i])+1);
- sSize := sSize+14+fLen+ORD(ODD(fLen));
- END
- ELSE IF (i = eDBtn) THEN
- BEGIN
- fProcPtr := @FrameDefaultBtn;
- fRect := gDBtnRect;
- fType := userItem + itemDisable;
- fLen := 0;
- sSize := sSize + 14;
- END
- ELSE
- SysBeep(60);
- END;
- SetHandleSize(sHdl,sSize);
- gDlogPtr := NewDialog(NIL,sDlogRect,'',
- FALSE,dBoxProc,POINTER(-1),FALSE,0,sHdl);
- FOR i := kChkFst TO kChkLst DO
- BEGIN
- GetDItem(gDlogPtr,ORD(i),sType,
- Handle(gHdl[i]),gRect[i]);
- IF gOption[eTrace] THEN
- TraceNbr('ChkChk’ing item ',ORD(i));
- ChkChk(i);
- END;
- END;
- {-------------------------------------------}
- FUNCTION KybdEquivsFilter
- (pDialogPtr: DialogPtr;
- VAR pEventRec: EventRecord;
- VAR pItemHit: INTEGER)
- : BOOLEAN;
- VAR
- sChar:
- RECORD
- CASE INTEGER OF
- 0:(F1,F2,F3: SignedByte;
- Enum: TMainItem);
- 1:(L: LONGINT);
- END;
- sItem: TMainItem;
- BEGIN
- sItem := eNotADlogItem;
- WITH pEventRec DO
- IF (what = keyDown) THEN
- BEGIN
- sChar.L := BAnd(message,charCodeMask);
- IF (sChar.L = $03)
- OR (sChar.L = $0D) THEN
- sItem := eDirs
- ELSE IF (sChar.L = ORD('D'))
- OR (sChar.L = ORD('d')) THEN
- sItem := eDiry
- ELSE IF (sChar.L = ORD('E'))
- OR (sChar.L = ORD('e')) THEN
- sItem := eEvery
- ELSE IF (sChar.L = ORD('F'))
- OR (sChar.L = ORD('f')) THEN
- sItem := eFiles
- ELSE IF (sChar.L = ORD('Q'))
- OR (sChar.L = ORD('q'))
- OR ((BAnd(modifiers,cmdKey)<>0)
- AND (sChar.L = ORD('.'))) THEN
- sItem := eQuit
- ELSE
- BEGIN
- sChar.L :=
- (sChar.L-ORD4('1')) + ORD(kChkFst);
- IF (sChar.L >= ORD(kChkFst))
- AND (sChar.L <= ORD(kChkLst)) THEN
- IF NOT(gDisabled[sChar.Enum]) THEN
- sItem := sChar.Enum;
- END;
- END;
- IF (sItem = eNotADlogItem) THEN
- KybdEquivsFilter := FALSE
- ELSE
- BEGIN
- pItemHit := ORD(sItem);
- KybdEquivsFilter := TRUE;
- END;
- END;
- {-------------------------------------------}
- FUNCTION MainDlogWorkRequested
- : TMainItem;
- VAR
- sItem:
- RECORD
- CASE INTEGER OF
- 0:(Filler: SignedByte;
- Enum: TMainItem);
- 1:(Int: INTEGER);
- END;
- BEGIN
- IF gOption[eTrace] THEN
- Trace('MainDlogWorkRequested');
- BringToFront(gDlogPtr);
- ShowWindow (gDlogPtr);
- ModalDialog (@KybdEquivsFilter,sItem.Int);
- WHILE (sItem.Enum >= kChkFst)
- AND (sItem.Enum <= kChkLst) DO
- BEGIN
- gOption[sItem.Enum] :=
- NOT(gOption[sItem.Enum]);
- ChkChk(sItem.Enum);
- IF (sItem.Enum = eFgPr) THEN
- BEGIN
- gDisabled[eFgPrC] := NOT(gOption[eFgPr]);
- gOption [eFgPrC] := FALSE;
- ChkChk(eFgPrC);
- END;
- ModalDialog (@KybdEquivsFilter,sItem.Int);
- END;
- HideWindow (gDlogPtr);
- SetPort (gGrafPtr);
- IF gOption[eTrace] THEN
- TraceNbr('Returning ',ORD(sItem.Enum));
- IF (sItem.Enum >= kItemFst)
- AND (sItem.Enum <= kItemLst) THEN
- MainDlogWorkRequested := sItem.Enum
- ELSE
- MainDlogWorkRequested := eQuit;
- END;
- {*******************************************}
- END.